package com.wyp.design.principle.dependencyinversion;

/**
 * 依赖倒置原则测试类
 *
 * @author: yipeng.wang01@hand-china.com-25490
 * @TIME: 2019/12/25/10:37
 **/
public class Test {

    //v1
//    /**
//     * 面向实现编程--不遵循依赖导致原则，这样每次学习一门课程就要去修改一下具体的实现类，换句话说，每次新增都要去修改底层模块，高层木块依赖了底层模块。
//     */
//    public static void main(String[] args) {
//        Oliver oliver = new Oliver();
//        oliver.studyJava();
//        oliver.studyPython();
//    }

    //    v2

//    /**
//     * 使用依赖倒置原则，通过接口传递参数
//     * @param args
//     */
//    public static void main(String[] args) {
//        Oliver oliver = new Oliver();
//        oliver.study(new JavaStudy());
//        oliver.study(new PythonStudy());
//    }


//    v3 通过构造参数进行具体实例的构造传递

    public static void main(String[] args) {
        Oliver oliver = new Oliver(new JavaStudy());
        oliver.study();
        //通过setter方法进行实例注入
        oliver.setStudy(new PythonStudy());
        oliver.study();
    }

    /**
     *依赖倒置原则原则，主要是说要面向接口编程，通过继承或者实现接口抽象类等，进行扩展基层模块（IStudy接口）不需要动JavaStudy类等，只进行扩展，
     * 当然这一特点也符合开闭原则。 在不动底层模块（Oliver类）只修改高层引用（Test类），就完成操作响应的操作（Oliver想学习哪门课）。
     */
}
